﻿#pragma once

#include "CoreMinimal.h"
#include "DepthStencilBuffer.generated.h"

UENUM()
enum class ESoftRendererDepthBufferType : uint8
{
	ZBuffer,
	ReversedZBuffer, 
	WBuffer,
};

/**
 * 深度模板缓存对象
 */
UCLASS(Blueprintable, BlueprintType)
class UDepthStencilBuffer : public UObject
{
	GENERATED_UCLASS_BODY()

public:
	/** 像素宽度 */
	int32 Width;

	/** 像素高度 */
	int32 Height;

	/** 深度缓存的一维数组数据 */
	TArray<float> DepthBuffer;

public:
	/**
	 * 指定缓存的新像素宽高
	 */
	UFUNCTION(BlueprintCallable)
	void Resize(int32 InWidth, int32 InHeight);

	/**
	 * 清理缓存数据
	 */
	UFUNCTION(BlueprintCallable)
	void Clear(ESoftRendererDepthBufferType DepthBufferType);
	
	/**
	 * 在X,Y对应位置的像素上填充深度值
	 */
	UFUNCTION(BlueprintCallable)
	void SetDepthValue(int32 X, int32 Y, float Value);

	/**
	 * 获取X,Y对应位置的像素上的深度值
	 */
	UFUNCTION(BlueprintCallable)
	float GetDepthValue(int32 X, int32 Y) const
	{
		if (X >= 0 && X < Width && Y >= 0 && Y < Height)
		{
			return DepthBuffer[Y * Width + X];
		}
		return 0;
	}
};
